Communication entre une application java et un sgbdr

 

Une application accédant à une base de donnée est forcément une application client-serveur !

(mais le client peut être unique)

 

Application client-Serveur

 

De nombreuses applications fonctionnent selon un environnement client/serveur, cela signifie que des machines clientes (des machines faisant partie du réseau) contactent un serveur, une machine généralement très puissante en terme de capacités d'entrée-sortie, qui leur fournit des services. Ici, le serveur héberge la base de données.

Dans une application de type client-serveur de données :

accès aux données avec JDBC

Pilote JDBC (Java Database Connectivity)

 

Pour se connecter à une base de données à partir d’un programme java, il faut un pilote jdbc : « logiciel » qui a connaissance des méthodes d’accès à votre base de données.

Pour obtenir plus d’informations sur les pilotes jdbc : http://java.sun.com/jdbc/drivers.html

 

Accès aux données

 

Tous les objets et les méthodes relatifs aux bases de données sont présents dans le package java.sql, il est donc indispensable d'importer java.sql.*

 

L’accès à une base de données doit être effectué en 5 étapes :

 

  1. Chargement du pilote
  2. Etablissement de la connexion à la base de données
  3. Exécution d’une requête
  4. Traitement du résultat
  5. Fermeture de la connexion

 


 

1 - Chargement du pilote

 

Ce pilote est disponible sous forme de classe java mais il est généralement compacté à l’intérieur d’un package de type  .jar. Il respecte l’interface Driver définie par Java.

La 1ère étape consiste donc à charger cette classe. Pour cela, il faut utiliser la méthode suivante :

 

Class Class

static Class

forName(String className)
        Returns the
Class object associated with the class or interface with the given string name.

 

L’utilisation de cette méthode peut lever une exception de type : ClassNotFoundException, il convient donc de placer cette instruction dans un bloc sécurisé.

 

Exemple :

 

String nomPilote = " org.postgresql.Driver" ;

// ou String nomPilote = "org.hsqldb.jdbcDriver";    // driver Hypersonic SQL

try

     {   Class.forName(nomPilote);     }

catch (ClassNotFoundException e)

      { System.out.println("problème chargement driver "+e); }

 

 

2 - Etablissement de la connexion

 

Il est préférable de ne démarrer la connexion qu’une seule fois, au démarrage de l’application.

 

Une fois le driver chargé, nous pouvons obtenir une connexion via la méthode suivante :

 

Class DriverManager

static Connection

getConnection(String url)
          Attempts to establish a connection to the given database URL.

static Connection

getConnection(String url, String user, String password)
          Attempts to establish a connection to the given database URL.

 

Remarques :

« jdbc : nomPilote : cheminBase ou alias »

 

Exemple 1 :

 

try

    { Connection connexion =   DriverManager.getConnection("jdbc:postgresql://igdb/exemple","ig","demo") ;  }

catch (SQLException e)

    { System.out.println("problème lors de la connexion à la bd "+e); }

 

 


 

Exemple 2 :

 

 

  final String url = "jdbc:hsqldb:/TonerExpress";

  final String user="sa";

  final String password="";

 

 Connection con = null;

 

try    {  con = DriverManager.getConnection(url, user, password); }

 

catch (SQLException e)

    { System.out.println("problème lors de la connexion à la bd "+e); }

 

 

 

 

 

3 - Exécution d’une requête

 

Toutes les instructions de requête sont susceptibles de lever des exceptions de type SQLException. Il faut donc toutes les placer dans des blocs sécurisés.

 

L’exécution d’une requête s’effectue via les méthodes suivantes:

 

 

Interface Statement

ResultSet

executeQuery(String sql)
          Executes the given SQL statement, which returns a single
ResultSet object.

 int

executeUpdate(String sql)
          Executes the given SQL statement, which may be an
INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.

 

 

Remarque : on distingue 2 types de requêtes :

 

Pour utiliser ces méthodes, vous devez donc utiliser un objet de type Statement. Pour créer un objet de cette classe, vous devez utiliser :

 

Interface Connection

 Statement

createStatement()
          Creates a
Statement object for sending SQL statements to the database.

 


 

création d’un objet pour accéder à la base

 

Exemple :

 

Statement stLienBd = connexion.createStatement() ; 

 

 

 

 

Requête d’interrogation

 

Exemple :

 

String requete = "SELECT * FROM CARTOUCHE";

 Resultset resultat = stLienBd.executeQuery(requete); 

 

 

 

Ou bien :

 

Resultset resultat = stLienBd.executeQuery("select * from cartouche"); 

 

 

 

 

 

Requête de mise à jour

 

Exemple 1 :

 

 

 String requete = "update cartouche set prixcartoucheneuve = prixcartoucheneuve * 1.03";

 stLienBd.executeUpdate(requete);  

 

 

 

Exemple 2 :

 

 

req = "INSERT INTO IMPRIMANTE VALUES(";

req += Integer.toString(refmax+1);

req += " , '" + this.ref.getText()+"','L',  '" + this.des.getText() +"')";

int nb = stat.executeUpdate(req);

 

 


 

4 - Traitement du résultat

 

Requête d’interrogation

 

La méthode executeUpdate() retourne un objet de type ResultSet.

 

Un objet de type ReSultSet peut contenir un ou plusieurs enregistrements. Afin de passer d’un enregistrement à l’autre, il faut utiliser la méthode next().

 

Pour récupérer les données contenues dans ces enregistrements, il faut utiliser les méthodes getString(), getInt() en précisant soit le nom de la colonne soit le numéro de la colonne de la donnée que l’on veut récupérer !

 

 

Interface ResultSet

 boolean

next()
          Moves the cursor down one row from its current position.

 String

getString(int columnIndex)
          Retrieves the value of the designated column in the current row of this
ResultSet object as a String in the Java programming language.

 String

getString(String columnName)
          Retrieves the value of the designated column in the current row of this
ResultSet object as a String in the Java programming language.

 int

getInt(int columnIndex)
          Retrieves the value of the designated column in the current row of this
ResultSet object as an int in the Java programming language.

 

Exemple 1 :

 

String requete = "select * from ngclient";

 Resultset resultat = stLienBd.executeQuery(requete); 

 while ( resultat.next() )

 {

    System.out.println("Numero" + resultat.getInt(1) );

    System.out.println("Nom" + resultat.getString(“nom”)  );

    System.out.println("Prenom" + resultat.getString(3) );

 }

 

Exemple 2 :

 

Statement stat = maConnexion.createStatement();

req = "SELECT * FROM IMPRIMANTE";

ResultSet rs = stat.executeQuery(req);

                       

TypeImprimante arg3;

while (rs.next()) {

            String arg2 = rs.getString(2);

            if (rs.getString(3).equals("L")) arg3 = l;

            else arg3 = j;

            String arg4 = rs.getString(4);

            lesImprimantes.add(new Imprimante(arg2,arg3,arg4,new TabCartouches()));

}

 

Requête de mise à jour

 

La méthode executeUpdate() retourne le nombre d’enregistrements impactés par l’instruction exécutée.

 

 Exemple :

 

 String requete = "delete * from  ngclient";

int nbSuppression =  stLienBd.executeUpdate(requete);  

System.out.println(nbSuppression + “ enregistrements ont été supprimés”);

 

 

Exemple 2 :

 

req = "INSERT INTO IMPRIMANTE VALUES(";

req += Integer.toString(refmax+1);

req += " , '" + this.ref.getText()+"','L',  '" + this.des.getText() +"')";

int nb = stat.executeUpdate(req);

if (nb==1) JOptionPane.showMessageDialog(this,"Imprimante ajoutée");

 

 

 

 

5 - Fermeture de la connexion

 

La fermeture de la connexion ne se fait qu’une seule fois, lors de la fermeture de l’application. Mais il ne faut pas l’oublier. Sans cela, vous risquez d’utiliser des ressources dont vous n’avez plus utilité… et, si vous êtes en mode mono-utilisateur, vous ne pourrez plus relancer votre application qui vous dira que la base de données est en cours d’utilisation.

 

Pour fermez explicitement une connexion, vous devez utiliser la méthode suivante :

 

Interface Connection

 void

close()         Releases this Connection object's database and JDBC resources immediately instead of waiting for them to be automatically released.

 

 

Exemple :

 

connexion.close();  

 

 

Ou

 

 

Exemple :

 

public void close(){

     try { if (con != null) { con.close(); } }

     catch (Exception e) { System.err.println(e); }

}